package pe.com.casadesign.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Repository;

import pe.com.casadesign.dao.BultoDAO;
import pe.com.casadesign.domain.Bulto;
import pe.com.casadesign.domain.Componente;
import pe.com.casadesign.domain.Guia;
import pe.com.casadesign.domain.Inventario;
import pe.com.casadesign.domain.Item;
import pe.com.casadesign.domain.ItemComponente;
import pe.com.casadesign.domain.LineaDetalleBulto;
import pe.com.casadesign.domain.LineaInventario;
import pe.com.casadesign.domain.LineaInventarioBulto;
import pe.com.casadesign.domain.LineaOrdenCompra;
import pe.com.casadesign.domain.ListaBulto;
import pe.com.casadesign.domain.ListaItem;
import pe.com.casadesign.domain.ListaItemComponente;
import pe.com.casadesign.domain.Moneda;
import pe.com.casadesign.domain.Producto;
import pe.com.casadesign.domain.Proveedor;
import pe.com.casadesign.domain.Tienda;
import pe.com.casadesign.domain.Usuario;

/**
 * Implementacion de BultoDAO.
 * 
 * @author Pedro Vera
 * 
 */
@Repository
public class BultoDAOImpl implements BultoDAO {
	private static final Logger logger = LoggerFactory.getLogger(BultoDAOImpl.class);
	
	// Nombre Procedimientos Almacenados
	private static String SP_LISTAR_BULTO_PRODUCTO = "SP_LISTAR_BULTO_PRODUCTO";
	private static String SP_OBTENER_BULTO_CONTENIDO = "SP_OBTENER_BULTO_CONTENIDO";
	private static String SP_CONSULTAR_BULTO_CONTENIDO = "SP_CONSULTAR_BULTO_CONTENIDO";
	private static String SP_OBTENER_BULTO_COMPONENTE = "SP_OBTENER_BULTO_COMPONENTE";
	private static String SP_VALIDAR_BULTO = "SP_VALIDAR_BULTO";
	private static String SP_REGISTRAR_BULTO = "SP_REGISTRAR_BULTO";
	private static String SP_REGISTRAR_DET_BULTO = "SP_REGISTRAR_DET_BULTO";
	private static String SP_MODIFICAR_ESTADO_BULTO = "SP_MODIFICAR_ESTADO_BULTO";
	private static String SP_OBTENER_BULTO = "SP_OBTENER_BULTO";
	private static String SP_CONSULTAR_DET_BULTO = "SP_CONSULTAR_DET_BULTO";
	private static String SP_LISTAR_BULTO_TIENDA = "SP_LISTAR_BULTO_TIENDA";
	
	// Parametros de Entrada
	private static String PARAM_CODPRODUCTO = "p_codproducto";
	private static String PARAM_CODBULTO = "p_codbulto";
	private static String PARAM_SSCC = "p_sscc";
	private static String PARAM_TOTALITEMS = "p_totalitems";
	private static String PARAM_SSCCPADRE = "p_ssccpadre";
	private static String PARAM_CODUSUARIO = "p_codusuario";
	private static String PARAM_CODTIENDA = "p_codtienda";
	private static String PARAM_ESTADO = "p_estado";
	
	private static String PARAM_CODITEM = "p_coditem";
	private static String PARAM_CODCOMPONENTE = "p_codcomponente";
	
	// Parametros de Salida
	private static String CODBULTO = "CODBULTO";
	private static String CODGUIA = "CODGUIA";
	private static String SSCC = "SSCC";
	private static String TOTALITEMS = "TOTALITEMS";
	private static String SSCCPADRE = "SSCCPADRE";
	private static String CODUSUARIO = "CODUSUARIO";
	private static String CODTIENDA = "CODTIENDA";
	private static String ESTADO = "ESTADO";
	private static String FECHAREGISTRO = "FECHAREGISTRO";
	
	private static String CONTAR = "CONTAR";
	
	private static String ITEM_CODITEM = "CODITEM";
	private static String ITEM_CODPRODUCTO = "CODPRODUCTO";
	private static String ITEM_CODPRODUCTOPROVEEDOR = "CODPRODUCTOPROVEEDOR";
	private static String ITEM_PRODUCTO_DESCRIPCION = "DESCRIPCION";
	private static String ITEM_CODIFICACION = "CODIFICACION"; 
	private static String ITEM_CODPROVEEDOR = "CODPROVEEDOR"; 
	private static String ITEM_ORIGEN = "ORIGEN"; 
	private static String ITEM_PROPIEDADES = "PROPIEDADES";
	private static String ITEM_PRECIOCOMPRA = "PRECIOCOMPRA"; 
	private static String ITEM_CODMONEDA = "CODMONEDA"; 
	private static String ITEM_CODOC = "CODOC"; 
	private static String ITEM_NROLINEA = "NROLINEA";
	private static String ITEM_CODTIENDA = "CODTIENDA";
	private static String ITEM_ESTADO = "ESTADO"; 
	private static String ITEM_FECHAREGISTRO = "FECHAREGISTRO";

	
	private static String COMPONENTE_CODITEM = "CODITEM";
	private static String COMPONENTE_CODCOMPONENTE = "CODCOMPONENTE";
	private static String COMPONENTE_DESCRIPCION = "DESCRIPCION";
	private static String COMPONENTE_CODIFICACION = "CODIFICACION";
	
	private static String LISTADO = "LISTADO";
	private static String LISTADO_LINEAS_ITEM = "LISTADO_LINEAS_ITEM";
	private static String LISTADO_LINEAS_COMPONENTE = "LISTADO_LINEAS_COMPONENTE";
	
	private static String TOTAL_FILAS_AFECTADAS = "#update-count-1";
	
	private JdbcTemplate jdbcTemplate;
	
	@Autowired
    public void setDataSource(DataSource dataSource)
    {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }

	@Override
	public ListaBulto listarBultoPorProducto(Producto producto, Bulto bulto) {
		logger.info("listarBultoPorProducto");

		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_LISTAR_BULTO_PRODUCTO).
	    						  returningResultSet(LISTADO, new RowMapper<Bulto>(){
									@Override
									public Bulto mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
								        final Bulto bulto = new Bulto();
								        bulto.setCodBulto(rs.getInt(CODBULTO));
								        bulto.setCodGuia(rs.getInt(CODGUIA));
								        bulto.setSSCC(rs.getString(SSCC));
								        bulto.setTotalItems(rs.getInt(TOTALITEMS));
								        bulto.setSSCCPadre(rs.getString(SSCCPADRE));
								        
								        Usuario usuario =  new Usuario();
								        usuario.setCodUsuario(rs.getInt(CODUSUARIO));
								        bulto.setUsuario(usuario);
								        
								        Tienda tienda =  new Tienda();
								        tienda.setCodigo(rs.getInt(CODTIENDA));
								        bulto.setTienda(tienda);
								        
								        bulto.setEstado(rs.getString(ESTADO));
								        bulto.setFechaRegistro(rs.getDate(FECHAREGISTRO).toString());
		
								        return bulto;
								    }
	    						  }
								);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_CODPRODUCTO, producto.getCodigo())
	    								.addValue(PARAM_CODTIENDA, bulto.getTienda().getCodigo()); 

	    // Establecer parametros y ejecutar SP
        Map<String,Object> data = llamarSP.execute(parametros);

        // Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<Bulto> listaBulto= (List<Bulto>)data.get(LISTADO);
        
		// Instanciando objeto ListaBulto
		ListaBulto listaBultoResultado = new ListaBulto();
        // Estableciendo resultado al objeto listaBultoResultado
		listaBultoResultado.setLista(listaBulto);
        
        if (logger.isDebugEnabled() && listaBultoResultado != null)
        {
            logger.debug("size=" + listaBultoResultado.size());
        }
        
        return listaBultoResultado;
	}

	
	@Override
	public Bulto obtenerBultoContenido(Bulto bulto) {
		logger.info("obtenerVenta");

		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_OBTENER_BULTO_CONTENIDO).
	    						  returningResultSet(LISTADO, new RowMapper<Bulto>(){
									@Override
									public Bulto mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
								        final Bulto bulto = new Bulto();
								        bulto.setCodBulto(rs.getInt(CODBULTO));
								        bulto.setSSCC(rs.getString(SSCC));
								        bulto.setSSCCPadre(rs.getString(SSCCPADRE));
								        bulto.setTotalItems(rs.getInt(TOTALITEMS));
								        bulto.setEstado(rs.getString(ESTADO));
								        bulto.setFechaRegistro(rs.getDate(FECHAREGISTRO).toString());
								        
								        Usuario usuario = new Usuario();
								        usuario.setCodUsuario(rs.getInt(CODUSUARIO));
								        bulto.setUsuario(usuario);
								        
								        return bulto;
								    }
	    						  }
								)
								.returningResultSet(LISTADO_LINEAS_ITEM, new RowMapper<Item>(){
									@Override
									public Item mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
										final Item item = new Item();
								        item.setCodItem(rs.getInt(ITEM_CODITEM));
								        
								        Producto producto = new Producto();
								        producto.setCodigo(rs.getInt(ITEM_CODPRODUCTO));
								        producto.setCodProductoProveedor(rs.getString(ITEM_CODPRODUCTOPROVEEDOR));
								        producto.setDescripcion(rs.getString(ITEM_PRODUCTO_DESCRIPCION));
								        item.setProducto(producto);
								        
								        item.setCodificacion(rs.getString(ITEM_CODIFICACION));
								        
								        Proveedor proveedor = new Proveedor();
								        proveedor.setCodProveedor(rs.getInt(ITEM_CODPROVEEDOR));
								        item.setProveedor(proveedor);
								        
								        item.setOrigen(rs.getString(ITEM_ORIGEN));
								        item.setPropiedades(rs.getString(ITEM_PROPIEDADES));
								        item.setPrecioCompra(rs.getDouble(ITEM_PRECIOCOMPRA));
								        
								        Moneda moneda = new Moneda();
								        moneda.setCodigo(rs.getInt(ITEM_CODMONEDA));
								        item.setMoneda(moneda);					    	
								    	
								        LineaOrdenCompra lineaOrdenCompra = new LineaOrdenCompra(); 
								        lineaOrdenCompra.setCodOC(rs.getInt(ITEM_CODOC));
								        lineaOrdenCompra.setNumeroLinea(rs.getInt(ITEM_NROLINEA));
								        item.setLineaOrdenCompra(lineaOrdenCompra);
								        
								        Tienda tienda = new Tienda();
								        tienda.setCodigo(rs.getInt(ITEM_CODTIENDA));
								        item.setTienda(tienda);
								        
								        item.setEstado(rs.getString(ITEM_ESTADO));
								        item.setFechaRegistro(rs.getDate(ITEM_FECHAREGISTRO).toString());
								        return item;
								        
								    }
	    						  })
	    						  .returningResultSet(LISTADO_LINEAS_COMPONENTE, new RowMapper<ItemComponente>(){
	    							  @Override
										public ItemComponente mapRow(final ResultSet rs,final int numRow) throws SQLException {
											final ItemComponente itemComponente = new ItemComponente();
											
											itemComponente.setCodComponente(rs.getInt(COMPONENTE_CODCOMPONENTE));
											itemComponente.setCodItem(rs.getInt(COMPONENTE_CODITEM));
											itemComponente.setCodificacion(rs.getString(COMPONENTE_CODIFICACION));
										
											return itemComponente;
										}
									});

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_CODBULTO, bulto.getCodBulto()); 

	    // Establecer parametros y ejecutar SP
        Map<String,Object> data = llamarSP.execute(parametros);

        // Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<Bulto> listaBulto = (List<Bulto>)data.get(LISTADO);
        
		// Declarando objeto Bulto Obtenido
 		Bulto bultoObtenido = null;
 		
 		if (logger.isDebugEnabled() && listaBulto != null)
        {
            logger.debug("size=" + listaBulto.size());
        }
		
 		if (listaBulto != null && listaBulto.size()>0){
 			// Obteniendo el primer elemento de la lista de bultos
 			bultoObtenido = listaBulto.get(0);
 		
	        // Obteniendo lista de lineas generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<Item> listaItem = (List<Item>)data.get(LISTADO_LINEAS_ITEM);
	        
			// Instanciando objeto ListaItem
			ListaItem listaItemResultado = new ListaItem();
	        // Estableciendo resultado al objeto listaItemResultado
			listaItemResultado.setLista(listaItem);
	        
			// --------------------------------------------------------------------------------------------
			// Obteniendo lista de lineas-item generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<ItemComponente> listaItemComponente = (List<ItemComponente>)data.get(LISTADO_LINEAS_COMPONENTE);
			
			for (Item item : listaItemResultado.getLista()){
				
				// Instanciando objeto ListaItemComponente
				ListaItemComponente listaItemComponenteResultado = new ListaItemComponente();
				
				for(ItemComponente itemComponente : listaItemComponenteResultado.getLista()){
					if( item.getCodItem() == itemComponente.getCodItem()){
						listaItemComponenteResultado.add(itemComponente);
					}
				}
			
				if(listaItemComponenteResultado.size()>0){
					item.setListaItemComponente(listaItemComponenteResultado);
				}
			}
			// --------------------------------------------------------------------------------------------
			
			// Asignando lista de lineas al objeto bulto creado
			bultoObtenido.setListaItem(listaItemResultado);
			
	        if (logger.isDebugEnabled() && listaItemResultado != null)
	        {
	            logger.debug("sizeLineas=" + listaItemResultado.size());
	        }
 		}

		return bultoObtenido;
	}
	
	
	@Override
	public Bulto consultarBultoContenido(Bulto bulto) {
		logger.info("obtenerVenta");

		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_CONSULTAR_BULTO_CONTENIDO).
	    						  returningResultSet(LISTADO, new RowMapper<Bulto>(){
									@Override
									public Bulto mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
								        final Bulto bulto = new Bulto();
								        bulto.setCodBulto(rs.getInt(CODBULTO));
								        bulto.setSSCC(rs.getString(SSCC));
								        bulto.setSSCCPadre(rs.getString(SSCCPADRE));
								        bulto.setTotalItems(rs.getInt(TOTALITEMS));
								        bulto.setEstado(rs.getString(ESTADO));
								        bulto.setFechaRegistro(rs.getDate(FECHAREGISTRO).toString());
								        
								        Usuario usuario = new Usuario();
								        usuario.setCodUsuario(rs.getInt(CODUSUARIO));
								        bulto.setUsuario(usuario);
								        
								        return bulto;
								    }
	    						  }
								)
								.returningResultSet(LISTADO_LINEAS_ITEM, new RowMapper<Item>(){
									@Override
									public Item mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
										final Item item = new Item();
								        item.setCodItem(rs.getInt(ITEM_CODITEM));
								        
								        Producto producto = new Producto();
								        producto.setCodigo(rs.getInt(ITEM_CODPRODUCTO));
								        producto.setCodProductoProveedor(rs.getString(ITEM_CODPRODUCTOPROVEEDOR));
								        producto.setDescripcion(rs.getString(ITEM_PRODUCTO_DESCRIPCION));
								        item.setProducto(producto);
								        
								        item.setCodificacion(rs.getString(ITEM_CODIFICACION));
								        
								        Proveedor proveedor = new Proveedor();
								        proveedor.setCodProveedor(rs.getInt(ITEM_CODPROVEEDOR));
								        item.setProveedor(proveedor);
								        
								        item.setOrigen(rs.getString(ITEM_ORIGEN));
								        item.setPropiedades(rs.getString(ITEM_PROPIEDADES));
								        item.setPrecioCompra(rs.getDouble(ITEM_PRECIOCOMPRA));
								        
								        Moneda moneda = new Moneda();
								        moneda.setCodigo(rs.getInt(ITEM_CODMONEDA));
								        item.setMoneda(moneda);
								        
								        LineaOrdenCompra lineaOrdenCompra = new LineaOrdenCompra(); 
								        lineaOrdenCompra.setCodOC(rs.getInt(ITEM_CODOC));
								        lineaOrdenCompra.setNumeroLinea(rs.getInt(ITEM_NROLINEA));
								        item.setLineaOrdenCompra(lineaOrdenCompra);
								        
								        Tienda tienda = new Tienda();
								        tienda.setCodigo(rs.getInt(ITEM_CODTIENDA));
								        item.setTienda(tienda);
								        
								        item.setEstado(rs.getString(ITEM_ESTADO));
								        item.setFechaRegistro(rs.getDate(ITEM_FECHAREGISTRO).toString());
								        return item;
								        
								    }
	    						  })
	    						  .returningResultSet(LISTADO_LINEAS_COMPONENTE, new RowMapper<ItemComponente>(){
	    							  @Override
										public ItemComponente mapRow(final ResultSet rs,final int numRow) throws SQLException
										{
											final ItemComponente itemComponente = new ItemComponente();
											
											itemComponente.setCodComponente(rs.getInt(COMPONENTE_CODCOMPONENTE));
											itemComponente.setCodItem(rs.getInt(COMPONENTE_CODITEM));
											itemComponente.setCodificacion(rs.getString(COMPONENTE_CODIFICACION));
										
											return itemComponente;
										}
									});

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_SSCC, bulto.getSSCC()); 

	    // Establecer parametros y ejecutar SP
        Map<String,Object> data = llamarSP.execute(parametros);

        // Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<Bulto> listaBulto = (List<Bulto>)data.get(LISTADO);
        
		// Declarando objeto Bulto Obtenido
 		Bulto bultoObtenido = null;
 		
 		if (logger.isDebugEnabled() && listaBulto != null)
        {
            logger.debug("size=" + listaBulto.size());
        }
		
 		if (listaBulto != null && listaBulto.size()>0){
 			// Obteniendo el primer elemento de la lista de bultos
 			bultoObtenido = listaBulto.get(0);
 		
	        // Obteniendo lista de lineas generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<Item> listaItem = (List<Item>)data.get(LISTADO_LINEAS_ITEM);
	        
			// Instanciando objeto ListaItem
			ListaItem listaItemResultado = new ListaItem();
	        // Estableciendo resultado al objeto listaItemResultado
			listaItemResultado.setLista(listaItem);
	        
			// --------------------------------------------------------------------------------------------
			// Obteniendo lista de lineas-item generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<ItemComponente> listaItemComponente = (List<ItemComponente>)data.get(LISTADO_LINEAS_COMPONENTE);
			
			for (Item item : listaItemResultado.getLista()){
				
				// Instanciando objeto ListaItemComponente
				ListaItemComponente listaItemComponenteResultado = new ListaItemComponente();
				
				for(ItemComponente itemComponente : listaItemComponenteResultado.getLista()){
					if( item.getCodItem() == itemComponente.getCodItem()){
						listaItemComponenteResultado.add(itemComponente);
					}
				}
			
				if(listaItemComponenteResultado.size()>0){
					item.setListaItemComponente(listaItemComponenteResultado);
				}
			}
			// --------------------------------------------------------------------------------------------
			
			// Asignando lista de lineas al objeto bulto creado
			bultoObtenido.setListaItem(listaItemResultado);
			
			
	        if (logger.isDebugEnabled() && listaItemResultado != null)
	        {
	            logger.debug("sizeLineas=" + listaItemResultado.size());
	        }
 		}

		return bultoObtenido;
	}
	
	@Override
	public Bulto obtenerBultoComponente(Bulto bulto) {
		logger.info("obtenerBultoComponente");

		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_OBTENER_BULTO_COMPONENTE).
	    						  returningResultSet(LISTADO, new RowMapper<Bulto>(){
									@Override
									public Bulto mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
								        final Bulto bulto = new Bulto();
								        bulto.setCodBulto(rs.getInt(CODBULTO));
								        bulto.setSSCC(rs.getString(SSCC));
								        bulto.setSSCCPadre(rs.getString(SSCCPADRE));
								        bulto.setTotalItems(rs.getInt(TOTALITEMS));
								        bulto.setEstado(rs.getString(ESTADO));
								        bulto.setFechaRegistro(rs.getDate(FECHAREGISTRO).toString());
								        
								        Usuario usuario = new Usuario();
								        usuario.setCodUsuario(rs.getInt(CODUSUARIO));
								        bulto.setUsuario(usuario);
								        
								        return bulto;
								    }
	    						  }
								)
								   .returningResultSet(LISTADO_LINEAS_COMPONENTE, new RowMapper<ItemComponente>(){
	    							  @Override
										public ItemComponente mapRow(final ResultSet rs,final int numRow) throws SQLException {
											final ItemComponente itemComponente = new ItemComponente();
											
											itemComponente.setCodComponente(rs.getInt(COMPONENTE_CODCOMPONENTE));
											itemComponente.setCodItem(rs.getInt(COMPONENTE_CODITEM));				
											itemComponente.setCodificacion(rs.getString(COMPONENTE_CODIFICACION));
										
											Componente componente = new Componente();
									        componente.setDescripcion(rs.getString(COMPONENTE_DESCRIPCION));
									        itemComponente.setComponente(componente);
									        
											return itemComponente;
										}
									});

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_CODBULTO, bulto.getCodBulto()); 

	    // Establecer parametros y ejecutar SP
        Map<String,Object> data = llamarSP.execute(parametros);

        // Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<Bulto> listaBulto = (List<Bulto>)data.get(LISTADO);
        
		// Declarando objeto Bulto Obtenido
 		Bulto bultoObtenido = null;
 		
 		if (logger.isDebugEnabled() && listaBulto != null)
        {
            logger.debug("size=" + listaBulto.size());
        }
		
 		if (listaBulto != null && listaBulto.size()>0){
 			// Obteniendo el primer elemento de la lista de bultos
 			bultoObtenido = listaBulto.get(0);
 		
	        // Obteniendo lista de lineas generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<ItemComponente> listaItemComponente = (List<ItemComponente>)data.get(LISTADO_LINEAS_COMPONENTE);
	        
			// Instanciando objeto ListaItem
			ListaItemComponente listaItemComponteResultado = new ListaItemComponente();
	        // Estableciendo resultado al objeto listaItemResultado
			listaItemComponteResultado.setLista(listaItemComponente);
	        		
			// Asignando lista de lineas al objeto bulto creado
			bultoObtenido.setListaItemComponente(listaItemComponteResultado);
			
	        if (logger.isDebugEnabled() && listaItemComponteResultado != null)
	        {
	            logger.debug("sizeLineas=" + listaItemComponteResultado.size());
	        }
 		}

		return bultoObtenido;
	}
	
	@Override
	public int validarBulto(Bulto bulto){
		logger.info("validarBulto");
		
		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_VALIDAR_BULTO)
	 				             .returningResultSet(LISTADO, new RowMapper<Bulto>() {
	 	          @Override
	 	          public Bulto mapRow(final ResultSet rs, final int numRow) throws SQLException {
	 						final Bulto bulto = new Bulto();
	 						bulto.setSSCC(rs.getString(CONTAR));
	 						
	 						return bulto;
	 	          }
	 				     });

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_SSCC, bulto.getSSCC());
	    							
	    
	 // Establecer parametros y ejecutar SP
	 		Map<String, Object> data = llamarSP.execute(parametros);

	 		// Obteniendo lista generada de ejecutar SP
	 		@SuppressWarnings("unchecked")
	 		List<Bulto> listaBulto = (List<Bulto>) data.get(LISTADO);

	 		// Declarando objeto Guia Obtenido
	 		Bulto BultoObtenido = null;

	 		if (logger.isDebugEnabled() && listaBulto != null) {
	 			logger.debug("size=" + listaBulto.size());
	 		}

	 		if (listaBulto != null && listaBulto.size() > 0) {
	 			// Obteniendo el primer elemento de la lista de Guia
	 			BultoObtenido = listaBulto.get(0);
	 		}
	 		
	    // Obteniendo el total de filas afectadas al ejecutar SP
	    int totalRegistrosAfectado = BultoObtenido.getCodBulto();
	        
	    return totalRegistrosAfectado;
	}
	
	@Override
	public boolean registrarBulto(Bulto bulto) {
		logger.info("registrarBulto");
		
		int resultado = 0;
		
		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
	    							  .withProcedureName(SP_REGISTRAR_BULTO);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_SSCC, bulto.getSSCC())
										.addValue(PARAM_TOTALITEMS , bulto.getTotalItems())
										.addValue(PARAM_SSCCPADRE, bulto.getSSCCPadre())
										.addValue(PARAM_CODUSUARIO, bulto.getUsuario().getCodUsuario())
										.addValue(PARAM_CODTIENDA, bulto.getTienda().getCodigo())
										.addValue(PARAM_ESTADO, bulto.getEstado());
	    
		
	    // Establecer parametros y ejecutar SP
	    Map<String,Object> data = llamarSP.execute(parametros);
	    
	    // Obteniendo el total de filas afectadas al ejecutar SP
	    resultado = (Integer) data.get(TOTAL_FILAS_AFECTADAS);
	    
	    logger.debug("codigo generado:" + data.get(PARAM_CODBULTO));

	    // Obteniendo codigo de inventario
	    int codigoBulto = (Integer)data.get(PARAM_CODBULTO);

	    // Estableciendo codigo de orden de compra generada
	    bulto.setCodBulto(codigoBulto);
 
	    return resultado > 0;
	}
	
	public boolean registrarDetalleBulto(LineaDetalleBulto lineaDetalleBulto) {
		logger.info("registrarDetalleBulto");
		
		int resultado = 0;
		
		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate)
	    							  .withProcedureName(SP_REGISTRAR_DET_BULTO);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
											.addValue(PARAM_CODITEM, lineaDetalleBulto.getItem().getCodItem())
											.addValue(PARAM_CODBULTO, lineaDetalleBulto.getBulto().getCodBulto())
											.addValue(PARAM_CODCOMPONENTE, lineaDetalleBulto.getComponente());
	    
	    // Establecer parametros y ejecutar SP
	    Map<String,Object> data = llamarSP.execute(parametros);
	    
	    // Obteniendo el total de filas afectadas al ejecutar SP
	    resultado = (Integer) data.get(TOTAL_FILAS_AFECTADAS);
	        
	    return resultado > 0;
		
	}
	
	public int modificarEstadoBulto(Bulto bulto){
		logger.info("moficiarEstadoBulto");
		
		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_MODIFICAR_ESTADO_BULTO);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_CODBULTO, bulto.getCodBulto())
	    								.addValue(PARAM_CODTIENDA, bulto.getTienda().getCodigo())
	    								.addValue(PARAM_ESTADO, bulto.getEstado());
	    
	    // Establecer parametros y ejecutar SP
	    Map<String,Object> data = llamarSP.execute(parametros);
	    
	    // Obteniendo el total de filas afectadas al ejecutar SP
	    int totalRegistrosAfectado = (Integer) data.get(TOTAL_FILAS_AFECTADAS);
	        
	    return totalRegistrosAfectado;
	}
	

	public Bulto obtenerBulto(Bulto bulto){
		logger.info("obtenerBulto");
		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_OBTENER_BULTO).
								  returningResultSet(LISTADO, new RowMapper<Bulto>(){
									@Override
									public Bulto mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {																			 
								        
										final Bulto bulto = new Bulto();
										bulto.setCodBulto(rs.getInt(CODBULTO));
										bulto.setSSCC(rs.getString(SSCC));
										bulto.setTotalItems(rs.getInt(TOTALITEMS));
										bulto.setSSCCPadre(rs.getString(SSCCPADRE));
										bulto.setFechaRegistro(rs.getDate(FECHAREGISTRO).toString());
										bulto.setEstado(rs.getString(ESTADO));
										
								        Usuario usuario = new Usuario();
								        usuario.setCodUsuario(rs.getInt(CODUSUARIO));
								        bulto.setUsuario(usuario);
								        
								        Tienda tienda = new Tienda();
								        tienda.setCodigo(rs.getInt(CODTIENDA));
								        bulto.setTienda(tienda);
								        
								        return bulto;
								        
								    }
								  }
								);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_SSCC, bulto.getSSCC());

	    // Establecer parametros y ejecutar SP
        Map<String,Object> data = llamarSP.execute(parametros);
               
        // Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<Bulto> listaBulto = (List<Bulto>)data.get(LISTADO);
        	
		// Declarando objeto item Obtenido
		Bulto bultoObtenido = null; 
		
		if (listaBulto != null && listaBulto.size()>0){
			// Obteniendo el primer elemento de la lista de item
			bultoObtenido = listaBulto.get(0);
		}
        
		return bultoObtenido;
	}
	
	public LineaDetalleBulto consultarDetalleBulto(LineaDetalleBulto lineaDetalleBulto){
		logger.info("consultarDetalleBulto");
		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_CONSULTAR_DET_BULTO).
								  returningResultSet(LISTADO, new RowMapper<LineaDetalleBulto>(){
									@Override
									public LineaDetalleBulto mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
								        
										final LineaDetalleBulto lineaDetalleBulto = new LineaDetalleBulto();
										lineaDetalleBulto.setComponente(rs.getInt(COMPONENTE_CODCOMPONENTE));
			        
								        Bulto bulto = new Bulto();
								        bulto.setCodBulto(rs.getInt(CODBULTO));
								        lineaDetalleBulto.setBulto(bulto);						        
								     								        
								        Item item = new Item();
								        item.setCodItem(rs.getInt(ITEM_CODITEM));
								        lineaDetalleBulto.setItem(item);
								        
								        
								        return lineaDetalleBulto;
								        
								    }
								  }
								);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_CODBULTO, lineaDetalleBulto.getBulto().getCodBulto())
	    								.addValue(PARAM_CODITEM, lineaDetalleBulto.getItem().getCodItem())
	    								.addValue(PARAM_CODCOMPONENTE, lineaDetalleBulto.getComponente());
		
	    // Establecer parametros y ejecutar SP
        Map<String,Object> data = llamarSP.execute(parametros);
               
        // Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<LineaDetalleBulto> listaLineaDetalleBulto = (List<LineaDetalleBulto>)data.get(LISTADO);
        	
		// Declarando objeto item Obtenido
		LineaDetalleBulto lineaDetalleBultoObtenido = null;
		
		if (listaLineaDetalleBulto != null && listaLineaDetalleBulto.size()>0){
			// Obteniendo el primer elemento de la lista de item
			lineaDetalleBultoObtenido = listaLineaDetalleBulto.get(0);
		}
        
		return lineaDetalleBultoObtenido;
	}
	@Override
	public ListaBulto listarBultoTienda(Bulto bulto) {
		logger.info("listarBultoTienda");

		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_LISTAR_BULTO_TIENDA).
	    						  returningResultSet(LISTADO, new RowMapper<Bulto>(){
									@Override
									public Bulto mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
								        final Bulto bulto = new Bulto();
								        bulto.setCodBulto(rs.getInt(CODBULTO));
								        bulto.setCodGuia(rs.getInt(CODGUIA));
								        bulto.setSSCC(rs.getString(SSCC));
								        bulto.setTotalItems(rs.getInt(TOTALITEMS));
								        bulto.setSSCCPadre(rs.getString(SSCCPADRE));
								        
								        Usuario usuario =  new Usuario();
								        usuario.setCodUsuario(rs.getInt(CODUSUARIO));
								        bulto.setUsuario(usuario);
								        
								        Tienda tienda =  new Tienda();
								        tienda.setCodigo(rs.getInt(CODTIENDA));
								        bulto.setTienda(tienda);
								        
								        bulto.setEstado(rs.getString(ESTADO));
								        bulto.setFechaRegistro(rs.getDate(FECHAREGISTRO).toString());
		
								        return bulto;
								    }
	    						  }
								);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_CODTIENDA, bulto.getTienda().getCodigo()); 

	    // Establecer parametros y ejecutar SP
        Map<String,Object> data = llamarSP.execute(parametros);

        // Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<Bulto> listaBulto= (List<Bulto>)data.get(LISTADO);
        
		// Instanciando objeto ListaBulto
		ListaBulto listaBultoResultado = new ListaBulto();
        // Estableciendo resultado al objeto listaBultoResultado
		listaBultoResultado.setLista(listaBulto);
        
        if (logger.isDebugEnabled() && listaBultoResultado != null)
        {
            logger.debug("size=" + listaBultoResultado.size());
        }
        
        return listaBultoResultado;
	}

}
